{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "ab8a31ce-00b7-4ea6-83e0-da183cd2ad7a",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "id": "1b23ff5d-7325-4406-b1bf-71395be5fe42",
   "metadata": {},
   "source": [
    "# Agentic RAG\n",
    "\n",
    "Agent是一个使用LLM作为engine的智能体系统，它具备访问外部工具的能力。所以系统核心有2点， 引擎（LLM） & 工具（tool）。引擎主要起到规划和反思的作用，工具让大模型可以去做很多复杂的事情，比如生成图片，生成视频，文档问答等等。\n",
    "\n",
    "Agentic RAG的概念，在2024年，Q2左右属于比较热门的一个类型，本质上是将RAG的召回看作是一个工具。由引擎来决策应该何时调用召回工具，以及调用工具的参数（问题拆解）是什么。\n",
    "\n",
    "\n",
    "这里用到的Agent框架是huggingface的transformers仓库自带的agent功能。\n",
    "\n",
    "llm_engine使用的智谱的模型，当然可以也可以自己预定义，例如下面使用Qwen来作为engine。\n",
    "\n",
    "```python\n",
    "import torch\n",
    "from transformers import AutoModelForCausalLM, AutoTokenizer\n",
    "device = \"cuda\" \n",
    "\n",
    "model = AutoModelForCausalLM.from_pretrained(\n",
    "    \"./Qwen1.5-14B-Chat\",\n",
    "    torch_dtype=torch.bfloat16,\n",
    "    device_map=\"auto\"\n",
    ").eval()\n",
    "\n",
    "def llm_engine(messages, stop_sequences=[\"<im_end>\"]):\n",
    "    # print(messages)\n",
    "    messages[1]['content'] = messages[0]['content'] + '\\n'  + messages[1]['content']\n",
    "    messages[0]['content'] = \"You are a helpful assistant.\"\n",
    "    \n",
    "    print(messages)\n",
    "    text = tokenizer.apply_chat_template(\n",
    "        messages,\n",
    "        tokenize=False,\n",
    "        add_generation_prompt=True\n",
    "    )\n",
    "    model_inputs = tokenizer([text], return_tensors=\"pt\").to(device)\n",
    "    \n",
    "    if stop_sequences:\n",
    "        stop_token_ids = [tokenizer(x, return_tensors='pt', add_special_tokens=False)['input_ids'] for x in stop_sequences]\n",
    "        stop_token_ids = [torch.LongTensor(x).to('cuda') for x in stop_token_ids]\n",
    "        stopping_criteria = [StopOnTokens(stop_token_ids)]\n",
    "    else:\n",
    "        stopping_criteria = []\n",
    "        \n",
    "    generated_ids = model.generate(\n",
    "        model_inputs.input_ids,\n",
    "        max_new_tokens=512,\n",
    "        do_sample=False,\n",
    "        # stop = stop_sequences\n",
    "        stopping_criteria = stopping_criteria\n",
    "    )\n",
    "    generated_ids = [\n",
    "        output_ids[len(input_ids):] for input_ids, output_ids in zip(model_inputs.input_ids, generated_ids)\n",
    "    ]\n",
    "    response = tokenizer.batch_decode(generated_ids, skip_special_tokens=True)[0]\n",
    "    return response\n",
    "```"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "ed2bb215-579a-4779-9f53-287896963423",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "id": "926e53fd-c0b5-447c-8b33-9aedcdd468bb",
   "metadata": {},
   "outputs": [],
   "source": [
    "from zhipuai import ZhipuAI\n",
    "client = ZhipuAI(api_key=\".WvLXD1MsFsGklOZa\") # 填写您自己的APIKey\n",
    "\n",
    "def llm_engine(messages, stop_sequences=None):\n",
    "    # print(messages)\n",
    "    for message in messages:\n",
    "        if message['role'] == 'tool-response':\n",
    "            message['role'] = 'user'\n",
    "    response = client.chat.completions.create(\n",
    "        model=\"glm-4-plus\", \n",
    "        messages=messages,\n",
    "        stop=stop_sequences\n",
    "    )\n",
    "    return response.choices[0].message.content\n",
    "\n",
    "\n",
    "from transformers import Tool\n",
    "\n",
    "class TextRetrieval(Tool):\n",
    "    name = \"text_retrieval\"\n",
    "    description = (\n",
    "        \"这是一个根据根据用户问题搜索文档库的工具，它返回一个跟用户问题相关的文档片段\"\n",
    "    )\n",
    "\n",
    "    inputs = {\n",
    "        \"query\": {\n",
    "            \"type\": \"text\",\n",
    "            \"description\": \"用户问题\",\n",
    "        }\n",
    "    }\n",
    "    output_type = \"text\"\n",
    "\n",
    "    def forward(self, query):\n",
    "        chunk1 = \"\"\"西湖\n",
    "西湖，又名钱塘湖，位于中国浙江省杭州市西湖区龙井路1号，杭州市区西部，汇水面积为21.22平方千米，湖面面积为6.38平方千米，为江南三大名湖之一。 [4-5] [22]\n",
    "西湖南、西、北三面环山，东邻城区，南部和钱塘江隔山相邻，湖中白堤、苏堤、杨公堤、赵公堤将湖面分割成若干水面，湖中有三岛，西湖群山以西湖为中心，由近及远可分为四个层次。 [7]西湖流域内年径流量为1400万立方米，蓄水量近1400万立方米。 [9]西湖是一座设备齐全、管理完善的灌溉济运水库，通过河渠和闸门，为杭州市区及周边农田提供了充足的水源。西湖还可以协助调节钱塘江的水位，防止城市内涝。 [16]\n",
    "2007年，西湖所在的杭州西湖风景名胜区被评为“国家AAAAA级旅游景区”。 [2] 2011年6月24日，杭州西湖文化景观被列入《世界遗产名录》。 [19]厉声教先生曾留下著名词篇《采桑子·西湖四咏》描写杭州西湖四季美景。\"\"\"\n",
    "\n",
    "        chunk2 = \"\"\"东湖\n",
    "东湖，又称裹脚湖，长江右岸湖泊。位于湖北省武汉市城区东部。全湖面积在正常高水位19.78米时为31.75平方公里，湖泊容积8150万立米，如以水位21.0米计则为32.8平方公里，相应最大湖容为1.241亿立方米。 [1]\n",
    "东湖是武汉市的重要水源地、水产养殖基地，也是知名生态旅游风景区、首批国家级风景名胜区。\n",
    "东湖自古就是游览胜地，历史上屈原、李白等不少名人曾在东湖留下足迹。东湖是最大的楚文化游览中心，楚风浓郁，楚韵精妙，行吟阁名播遐迩，离骚碑誉为“三绝”，楚天台气势磅礴，楚才园名人荟萃，楚市、屈原塑像、屈原纪念馆，内涵丰富。也是解放后毛泽东同志除中南海外居住时间最长的地方。\n",
    "东湖也是武汉市区重要的文化中心，周边聚集了武汉大学、华中科技大学、中国地质大学（武汉）等26所高等院校，中科院武汉植物园等56个国家、省、部属科研院所，东湖新技术开发区国家光电子产业基地——中国光谷、湖北省博物馆，湖北美术馆，文化底蕴深厚。 [2\"\"\"\n",
    "\n",
    "        if '东湖' in query:\n",
    "            return chunk2\n",
    "        return chunk1\n",
    "                "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "id": "6e85a06a-9836-497c-a432-89b04f1eaa37",
   "metadata": {},
   "outputs": [],
   "source": [
    "from transformers import Tool, load_tool, CodeAgent,ReactJsonAgent"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "id": "3d83ee93-31d9-4e2a-9d72-0a9c95352fd1",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\u001b[33;1m======== New task ========\u001b[0m\n",
      "\u001b[37;1m武汉东湖跟杭州西湖哪个大？，大多少呢？\u001b[0m\n",
      "===== Calling LLM with this last message: =====\n",
      "{'role': <MessageRole.USER: 'user'>, 'content': 'Task: 武汉东湖跟杭州西湖哪个大？，大多少呢？'}\n",
      "\u001b[33;1mCalling tool: 'text_retrieval' with arguments: {'query': '武汉东湖面积'}\u001b[0m\n",
      "东湖\n",
      "东湖，又称裹脚湖，长江右岸湖泊。位于湖北省武汉市城区东部。全湖面积在正常高水位19.78米时为31.75平方公里，湖泊容积8150万立米，如以水位21.0米计则为32.8平方公里，相应最大湖容为1.241亿立方米。 [1]\n",
      "东湖是武汉市的重要水源地、水产养殖基地，也是知名生态旅游风景区、首批国家级风景名胜区。\n",
      "东湖自古就是游览胜地，历史上屈原、李白等不少名人曾在东湖留下足迹。东湖是最大的楚文化游览中心，楚风浓郁，楚韵精妙，行吟阁名播遐迩，离骚碑誉为“三绝”，楚天台气势磅礴，楚才园名人荟萃，楚市、屈原塑像、屈原纪念馆，内涵丰富。也是解放后毛泽东同志除中南海外居住时间最长的地方。\n",
      "东湖也是武汉市区重要的文化中心，周边聚集了武汉大学、华中科技大学、中国地质大学（武汉）等26所高等院校，中科院武汉植物园等56个国家、省、部属科研院所，东湖新技术开发区国家光电子产业基地——中国光谷、湖北省博物馆，湖北美术馆，文化底蕴深厚。 [2\n",
      "===== Calling LLM with this last message: =====\n",
      "{'role': <MessageRole.TOOL_RESPONSE: 'tool-response'>, 'content': 'Observation: 东湖\\n东湖，又称裹脚湖，长江右岸湖泊。位于湖北省武汉市城区东部。全湖面积在正常高水位19.78米时为31.75平方公里，湖泊容积8150万立米，如以水位21.0米计则为32.8平方公里，相应最大湖容为1.241亿立方米。 [1]\\n东湖是武汉市的重要水源地、水产养殖基地，也是知名生态旅游风景区、首批国家级风景名胜区。\\n东湖自古就是游览胜地，历史上屈原、李白等不少名人曾在东湖留下足迹。东湖是最大的楚文化游览中心，楚风浓郁，楚韵精妙，行吟阁名播遐迩，离骚碑誉为“三绝”，楚天台气势磅礴，楚才园名人荟萃，楚市、屈原塑像、屈原纪念馆，内涵丰富。也是解放后毛泽东同志除中南海外居住时间最长的地方。\\n东湖也是武汉市区重要的文化中心，周边聚集了武汉大学、华中科技大学、中国地质大学（武汉）等26所高等院校，中科院武汉植物园等56个国家、省、部属科研院所，东湖新技术开发区国家光电子产业基地——中国光谷、湖北省博物馆，湖北美术馆，文化底蕴深厚。 [2'}\n",
      "\u001b[33;1mCalling tool: 'text_retrieval' with arguments: {'query': '杭州西湖面积'}\u001b[0m\n",
      "西湖\n",
      "西湖，又名钱塘湖，位于中国浙江省杭州市西湖区龙井路1号，杭州市区西部，汇水面积为21.22平方千米，湖面面积为6.38平方千米，为江南三大名湖之一。 [4-5] [22]\n",
      "西湖南、西、北三面环山，东邻城区，南部和钱塘江隔山相邻，湖中白堤、苏堤、杨公堤、赵公堤将湖面分割成若干水面，湖中有三岛，西湖群山以西湖为中心，由近及远可分为四个层次。 [7]西湖流域内年径流量为1400万立方米，蓄水量近1400万立方米。 [9]西湖是一座设备齐全、管理完善的灌溉济运水库，通过河渠和闸门，为杭州市区及周边农田提供了充足的水源。西湖还可以协助调节钱塘江的水位，防止城市内涝。 [16]\n",
      "2007年，西湖所在的杭州西湖风景名胜区被评为“国家AAAAA级旅游景区”。 [2] 2011年6月24日，杭州西湖文化景观被列入《世界遗产名录》。 [19]厉声教先生曾留下著名词篇《采桑子·西湖四咏》描写杭州西湖四季美景。\n",
      "===== Calling LLM with this last message: =====\n",
      "{'role': <MessageRole.USER: 'user'>, 'content': \"Reminder: you are working towards solving the following task: 武汉东湖跟杭州西湖哪个大？，大多少呢？\\nHere is a summary of your past tool calls and their results:\\nStep 1\\nStep 2\\nTool call:{'tool_name': 'text_retrieval', 'tool_arguments': {'query': '武汉东湖面积'}}\"}\n",
      "\u001b[33;1mCalling tool: 'final_answer' with arguments: {'answer': '武汉东湖比杭州西湖大，面积差为31.75 - 6.38 = 25.37平方公里'}\u001b[0m\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "'武汉东湖比杭州西湖大，面积差为31.75 - 6.38 = 25.37平方公里'"
      ]
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "agent = ReactJsonAgent(tools=[TextRetrieval()], verbose=1, llm_engine=llm_engine)\n",
    "\n",
    "agent.run(\n",
    "    \"武汉东湖跟杭州西湖哪个大？，大多少呢？\"\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "id": "09d7ac56-d51f-456c-ac00-acb5783df093",
   "metadata": {},
   "outputs": [],
   "source": [
    "from transformers import Tool, load_tool, CodeAgent,ReactCodeAgent"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "id": "3ad0dfab-7fc4-479f-b738-1f6341cfb6ce",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\u001b[33;1m======== New task ========\u001b[0m\n",
      "\u001b[37;1m武汉东湖跟杭州西湖哪个大？，大多少呢？\u001b[0m\n",
      "===== Calling LLM with these last messages: =====\n",
      "[{'role': <MessageRole.SYSTEM: 'system'>, 'content': 'You will be given a task to solve as best you can.\\nYou have access to the following tools:\\n\\n- text_retrieval: 这是一个根据根据用户问题搜索文档库的工具，它返回一个跟用户问题相关的文档片段\\n    Takes inputs: {\\'query\\': {\\'type\\': \\'text\\', \\'description\\': \\'用户问题\\'}}\\n\\n- final_answer: Provides a final answer to the given problem\\n    Takes inputs: {\\'answer\\': {\\'type\\': \\'text\\', \\'description\\': \\'The final answer to the problem\\'}}\\n\\nTo solve the task, you must plan forward to proceed in a series of steps, in a cycle of \\'Thought:\\', \\'Code:\\', and \\'Observation:\\' sequences.\\n\\nAt each step, in the \\'Thought:\\' sequence, you should first explain your reasoning towards solving the task, then the tools that you want to use.\\nThen in the \\'Code:\\' sequence, you shold write the code in simple Python. The code sequence must end with \\'/End code\\' sequence.\\nDuring each intermediate step, you can use \\'print()\\' to save whatever important information you will then need.\\nThese print outputs will then be available in the \\'Observation:\\' field, for using this information as input for the next step.\\n\\nIn the end you have to return a final answer using the `final_answer` tool.\\n\\nHere are a few examples using notional tools:\\n---\\nTask: \"Generate an image of the oldest person in this document.\"\\n\\nThought: I will proceed step by step and use the following tools: `document_qa` to find the oldest person in the document, then `image_generator` to generate an image according to the answer.\\nCode:\\n```py\\nanswer = document_qa(document=document, question=\"Who is the oldest person mentioned?\")\\nprint(answer)\\n```<end_code>\\nObservation: \"The oldest person in the document is John Doe, a 55 year old lumberjack living in Newfoundland.\"\\n\\nThought: I will now generate an image showcasing the oldest person.\\n\\nCode:\\n```py\\nimage = image_generator(\"A portrait of John Doe, a 55-year-old man living in Canada.\")\\nfinal_answer(image)\\n```<end_code>\\n\\n---\\nTask: \"What is the result of the following operation: 5 + 3 + 1294.678?\"\\n\\nThought: I will use python code to compute the result of the operation and then return the final answer using the `final_answer` tool\\n\\nCode:\\n```py\\nresult = 5 + 3 + 1294.678\\nfinal_answer(result)\\n```<end_code>\\n\\n---\\nTask: \"Which city has the highest population , Guangzhou or Shanghai?\"\\n\\nThought: I need to get the populations for both cities and compare them: I will use the tool `search` to get the population of both cities.\\nCode:\\n```py\\npopulation_guangzhou = search(\"Guangzhou population\")\\nprint(\"Population Guangzhou:\", population_guangzhou)\\npopulation_shanghai = search(\"Shanghai population\")\\nprint(\"Population Shanghai:\", population_shanghai)\\n```<end_code>\\nObservation:\\nPopulation Guangzhou: [\\'Guangzhou has a population of 15 million inhabitants as of 2021.\\']\\nPopulation Shanghai: \\'26 million (2019)\\'\\n\\nThought: Now I know that Shanghai has the highest population.\\nCode:\\n```py\\nfinal_answer(\"Shanghai\")\\n```<end_code>\\n\\n---\\nTask: \"What is the current age of the pope, raised to the power 0.36?\"\\n\\nThought: I will use the tool `search` to get the age of the pope, then raise it to the power 0.36.\\nCode:\\n```py\\npope_age = search(query=\"current pope age\")\\nprint(\"Pope age:\", pope_age)\\n```<end_code>\\nObservation:\\nPope age: \"The pope Francis is currently 85 years old.\"\\n\\nThought: I know that the pope is 85 years old. Let\\'s compute the result using python code.\\nCode:\\n```py\\npope_current_age = 85 ** 0.36\\nfinal_answer(pope_current_age)\\n```<end_code>\\n\\n\\nAbove example were using notional tools that might not exist for you. You only have acces to those tools:\\n\\'text_retrieval\\', \\'final_answer\\'\\nYou also can perform computations in the python code you generate.\\n\\nAlways provide a \\'Thought:\\' and a \\'Code:\\n```py\\' sequence ending with \\'```<end_code>\\' sequence. You MUST provide at least the \\'Code:\\' sequence to move forward.\\n\\nRemember to not perform too many operations in a single code block! You should split the task into intermediate code blocks.\\nPrint results at the end of each step to save the intermediate results. Then use final_answer() to return the final result.\\n\\nRemember to make sure that variables you use are all defined.\\nDO NOT pass the arguments as a dict as in \\'answer = ask_search_agent({\\'query\\': \"What is the place where James Bond lives?\"})\\', but use the arguments directly as in \\'answer = ask_search_agent(query=\"What is the place where James Bond lives?\")\\'.\\n\\nNow Begin!\\n'}, {'role': <MessageRole.USER: 'user'>, 'content': 'Task: 武汉东湖跟杭州西湖哪个大？，大多少呢？'}]\n",
      "\u001b[33;1m==== Agent is executing the code below:\u001b[0m\n",
      "\u001b[0m\u001b[38;5;60;03m# 获取武汉东湖的面积信息\u001b[39;00m\n",
      "\u001b[38;5;7mdonghu_area_info\u001b[39m\u001b[38;5;7m \u001b[39m\u001b[38;5;109;01m=\u001b[39;00m\u001b[38;5;7m \u001b[39m\u001b[38;5;7mtext_retrieval\u001b[39m\u001b[38;5;7m(\u001b[39m\u001b[38;5;7mquery\u001b[39m\u001b[38;5;109;01m=\u001b[39;00m\u001b[38;5;144m\"\u001b[39m\u001b[38;5;144m武汉东湖面积\u001b[39m\u001b[38;5;144m\"\u001b[39m\u001b[38;5;7m)\u001b[39m\n",
      "\u001b[38;5;109mprint\u001b[39m\u001b[38;5;7m(\u001b[39m\u001b[38;5;144m\"\u001b[39m\u001b[38;5;144m武汉东湖面积信息:\u001b[39m\u001b[38;5;144m\"\u001b[39m\u001b[38;5;7m,\u001b[39m\u001b[38;5;7m \u001b[39m\u001b[38;5;7mdonghu_area_info\u001b[39m\u001b[38;5;7m)\u001b[39m\n",
      "\n",
      "\u001b[38;5;60;03m# 获取杭州西湖的面积信息\u001b[39;00m\n",
      "\u001b[38;5;7mxihu_area_info\u001b[39m\u001b[38;5;7m \u001b[39m\u001b[38;5;109;01m=\u001b[39;00m\u001b[38;5;7m \u001b[39m\u001b[38;5;7mtext_retrieval\u001b[39m\u001b[38;5;7m(\u001b[39m\u001b[38;5;7mquery\u001b[39m\u001b[38;5;109;01m=\u001b[39;00m\u001b[38;5;144m\"\u001b[39m\u001b[38;5;144m杭州西湖面积\u001b[39m\u001b[38;5;144m\"\u001b[39m\u001b[38;5;7m)\u001b[39m\n",
      "\u001b[38;5;109mprint\u001b[39m\u001b[38;5;7m(\u001b[39m\u001b[38;5;144m\"\u001b[39m\u001b[38;5;144m杭州西湖面积信息:\u001b[39m\u001b[38;5;144m\"\u001b[39m\u001b[38;5;7m,\u001b[39m\u001b[38;5;7m \u001b[39m\u001b[38;5;7mxihu_area_info\u001b[39m\u001b[38;5;7m)\u001b[39m\u001b[0m\n",
      "\u001b[33;1m====\u001b[0m\n",
      "\u001b[33;1mPrint outputs:\u001b[0m\n",
      "\u001b[32;20m武汉东湖面积信息: 东湖\n",
      "东湖，又称裹脚湖，长江右岸湖泊。位于湖北省武汉市城区东部。全湖面积在正常高水位19.78米时为31.75平方公里，湖泊容积8150万立米，如以水位21.0米计则为32.8平方公里，相应最大湖容为1.241亿立方米。 [1]\n",
      "东湖是武汉市的重要水源地、水产养殖基地，也是知名生态旅游风景区、首批国家级风景名胜区。\n",
      "东湖自古就是游览胜地，历史上屈原、李白等不少名人曾在东湖留下足迹。东湖是最大的楚文化游览中心，楚风浓郁，楚韵精妙，行吟阁名播遐迩，离骚碑誉为“三绝”，楚天台气势磅礴，楚才园名人荟萃，楚市、屈原塑像、屈原纪念馆，内涵丰富。也是解放后毛泽东同志除中南海外居住时间最长的地方。\n",
      "东湖也是武汉市区重要的文化中心，周边聚集了武汉大学、华中科技大学、中国地质大学（武汉）等26所高等院校，中科院武汉植物园等56个国家、省、部属科研院所，东湖新技术开发区国家光电子产业基地——中国光谷、湖北省博物馆，湖北美术馆，文化底蕴深厚。 [2\n",
      "杭州西湖面积信息: 西湖\n",
      "西湖，又名钱塘湖，位于中国浙江省杭州市西湖区龙井路1号，杭州市区西部，汇水面积为21.22平方千米，湖面面积为6.38平方千米，为江南三大名湖之一。 [4-5] [22]\n",
      "西湖南、西、北三面环山，东邻城区，南部和钱塘江隔山相邻，湖中白堤、苏堤、杨公堤、赵公堤将湖面分割成若干水面，湖中有三岛，西湖群山以西湖为中心，由近及远可分为四个层次。 [7]西湖流域内年径流量为1400万立方米，蓄水量近1400万立方米。 [9]西湖是一座设备齐全、管理完善的灌溉济运水库，通过河渠和闸门，为杭州市区及周边农田提供了充足的水源。西湖还可以协助调节钱塘江的水位，防止城市内涝。 [16]\n",
      "2007年，西湖所在的杭州西湖风景名胜区被评为“国家AAAAA级旅游景区”。 [2] 2011年6月24日，杭州西湖文化景观被列入《世界遗产名录》。 [19]厉声教先生曾留下著名词篇《采桑子·西湖四咏》描写杭州西湖四季美景。\n",
      "\u001b[0m\n",
      "===== Calling LLM with these last messages: =====\n",
      "[{'role': <MessageRole.ASSISTANT: 'assistant'>, 'content': 'Thought: 首先，我需要使用 `text_retrieval` 工具来获取武汉东湖和杭州西湖的面积信息。然后，我将比较这两个湖泊的面积，并计算它们之间的差异。\\n\\nCode:\\n```py\\n# 获取武汉东湖的面积信息\\ndonghu_area_info = text_retrieval(query=\"武汉东湖面积\")\\nprint(\"武汉东湖面积信息:\", donghu_area_info)\\n\\n# 获取杭州西湖的面积信息\\nxihu_area_info = text_retrieval(query=\"杭州西湖面积\")\\nprint(\"杭州西湖面积信息:\", xihu_area_info)\\n```<end_code>\\n'}, {'role': <MessageRole.TOOL_RESPONSE: 'tool-response'>, 'content': 'Observation: 武汉东湖面积信息: 东湖\\n东湖，又称裹脚湖，长江右岸湖泊。位于湖北省武汉市城区东部。全湖面积在正常高水位19.78米时为31.75平方公里，湖泊容积8150万立米，如以水位21.0米计则为32.8平方公里，相应最大湖容为1.241亿立方米。 [1]\\n东湖是武汉市的重要水源地、水产养殖基地，也是知名生态旅游风景区、首批国家级风景名胜区。\\n东湖自古就是游览胜地，历史上屈原、李白等不少名人曾在东湖留下足迹。东湖是最大的楚文化游览中心，楚风浓郁，楚韵精妙，行吟阁名播遐迩，离骚碑誉为“三绝”，楚天台气势磅礴，楚才园名人荟萃，楚市、屈原塑像、屈原纪念馆，内涵丰富。也是解放后毛泽东同志除中南海外居住时间最长的地方。\\n东湖也是武汉市区重要的文化中心，周边聚集了武汉大学、华中科技大学、中国地质大学（武汉）等26所高等院校，中科院武汉植物园等56个国家、省、部属科研院所，东湖新技术开发区国家光电子产业基地——中国光谷、湖北省博物馆，湖北美术馆，文化底蕴深厚。 [2\\n杭州西湖面积信息: 西湖\\n西湖，又名钱塘湖，位于中国浙江省杭州市西湖区龙井路1号，杭州市区西部，汇水面积为21.22平方千米，湖面面积为6.38平方千米，为江南三大名湖之一。 [4-5] [22]\\n西湖南、西、北三面环山，东邻城区，南部和钱塘江隔山相邻，湖中白堤、苏堤、杨公堤、赵公堤将湖面分割成若干水面，湖中有三岛，西湖群山以西湖为中心，由近及远可分为四个层次。 [7]西湖流域内年径流量为1400万立方米，蓄水量近1400万立方米。 [9]西湖是一座设备齐全、管理完善的灌溉济运水库，通过河渠和闸门，为杭州市区及周边农田提供了充足的水源。西湖还可以协助调节钱塘江的水位，防止城市内涝。 [16]\\n2007年，西湖所在的杭州西湖风景名胜区被评为“国家AAAAA级旅游景区”。 [2] 2011年6月24日，杭州西湖文化景观被列入《世界遗产名录》。 [19]厉声教先生曾留下著名词篇《采桑子·西湖四咏》描写杭州西湖四季美景。\\n'}]\n",
      "\u001b[33;1m==== Agent is executing the code below:\u001b[0m\n",
      "\u001b[0m\u001b[38;5;60;03m# 将武汉东湖的面积从平方公里转换为平方千米\u001b[39;00m\n",
      "\u001b[38;5;7mdonghu_area_km2\u001b[39m\u001b[38;5;7m \u001b[39m\u001b[38;5;109;01m=\u001b[39;00m\u001b[38;5;7m \u001b[39m\u001b[38;5;139m31.75\u001b[39m\u001b[38;5;7m  \u001b[39m\u001b[38;5;60;03m# 武汉东湖面积，单位：平方千米\u001b[39;00m\n",
      "\n",
      "\u001b[38;5;60;03m# 杭州西湖的面积已经是平方千米\u001b[39;00m\n",
      "\u001b[38;5;7mxihu_area_km2\u001b[39m\u001b[38;5;7m \u001b[39m\u001b[38;5;109;01m=\u001b[39;00m\u001b[38;5;7m \u001b[39m\u001b[38;5;139m6.38\u001b[39m\u001b[38;5;7m  \u001b[39m\u001b[38;5;60;03m# 杭州西湖面积，单位：平方千米\u001b[39;00m\n",
      "\n",
      "\u001b[38;5;60;03m# 计算两个湖泊的面积差异\u001b[39;00m\n",
      "\u001b[38;5;7marea_difference\u001b[39m\u001b[38;5;7m \u001b[39m\u001b[38;5;109;01m=\u001b[39;00m\u001b[38;5;7m \u001b[39m\u001b[38;5;7mdonghu_area_km2\u001b[39m\u001b[38;5;7m \u001b[39m\u001b[38;5;109;01m-\u001b[39;00m\u001b[38;5;7m \u001b[39m\u001b[38;5;7mxihu_area_km2\u001b[39m\n",
      "\u001b[38;5;109mprint\u001b[39m\u001b[38;5;7m(\u001b[39m\u001b[38;5;144m\"\u001b[39m\u001b[38;5;144m面积差异:\u001b[39m\u001b[38;5;144m\"\u001b[39m\u001b[38;5;7m,\u001b[39m\u001b[38;5;7m \u001b[39m\u001b[38;5;7marea_difference\u001b[39m\u001b[38;5;7m)\u001b[39m\n",
      "\n",
      "\u001b[38;5;60;03m# 确定哪个湖泊更大\u001b[39;00m\n",
      "\u001b[38;5;7mlarger_lake\u001b[39m\u001b[38;5;7m \u001b[39m\u001b[38;5;109;01m=\u001b[39;00m\u001b[38;5;7m \u001b[39m\u001b[38;5;144m\"\u001b[39m\u001b[38;5;144m武汉东湖\u001b[39m\u001b[38;5;144m\"\u001b[39m\u001b[38;5;7m \u001b[39m\u001b[38;5;109;01mif\u001b[39;00m\u001b[38;5;7m \u001b[39m\u001b[38;5;7mdonghu_area_km2\u001b[39m\u001b[38;5;7m \u001b[39m\u001b[38;5;109;01m>\u001b[39;00m\u001b[38;5;7m \u001b[39m\u001b[38;5;7mxihu_area_km2\u001b[39m\u001b[38;5;7m \u001b[39m\u001b[38;5;109;01melse\u001b[39;00m\u001b[38;5;7m \u001b[39m\u001b[38;5;144m\"\u001b[39m\u001b[38;5;144m杭州西湖\u001b[39m\u001b[38;5;144m\"\u001b[39m\n",
      "\u001b[38;5;109mprint\u001b[39m\u001b[38;5;7m(\u001b[39m\u001b[38;5;144m\"\u001b[39m\u001b[38;5;144m更大的湖泊:\u001b[39m\u001b[38;5;144m\"\u001b[39m\u001b[38;5;7m,\u001b[39m\u001b[38;5;7m \u001b[39m\u001b[38;5;7mlarger_lake\u001b[39m\u001b[38;5;7m)\u001b[39m\u001b[0m\n",
      "\u001b[33;1m====\u001b[0m\n",
      "\u001b[33;1mPrint outputs:\u001b[0m\n",
      "\u001b[32;20m面积差异: 25.37\n",
      "更大的湖泊: 武汉东湖\n",
      "\u001b[0m\n",
      "===== Calling LLM with these last messages: =====\n",
      "[{'role': <MessageRole.TOOL_RESPONSE: 'tool-response'>, 'content': 'Observation: 面积差异: 25.37\\n更大的湖泊: 武汉东湖\\n'}, {'role': <MessageRole.USER: 'user'>, 'content': 'Reminder: you are working towards solving the following task: 武汉东湖跟杭州西湖哪个大？，大多少呢？\\nHere is a summary of your past tool calls and their results:\\nStep 1\\nStep 2\\nTool call:{\\'tool_name\\': \\'code interpreter\\', \\'tool_arguments\\': \\'# 获取武汉东湖的面积信息\\\\ndonghu_area_info = text_retrieval(query=\"武汉东湖面积\")\\\\nprint(\"武汉东湖面积信息:\", donghu_area_info)\\\\n\\\\n# 获取杭州西湖的面积信息\\\\nxihu_area_info = text_retrieval(query=\"杭州西湖面积\")\\\\nprint(\"杭州西湖面积信息:\", xihu_area_info)\\'}'}]\n",
      "\u001b[33;1m==== Agent is executing the code below:\u001b[0m\n",
      "\u001b[0m\u001b[38;5;7mfinal_answer\u001b[39m\u001b[38;5;7m(\u001b[39m\u001b[38;5;144mf\u001b[39m\u001b[38;5;144m\"\u001b[39m\u001b[38;5;144m武汉东湖比杭州西湖大，大 \u001b[39m\u001b[38;5;144m{\u001b[39m\u001b[38;5;7marea_difference\u001b[39m\u001b[38;5;144m}\u001b[39m\u001b[38;5;144m 平方千米。\u001b[39m\u001b[38;5;144m\"\u001b[39m\u001b[38;5;7m)\u001b[39m\u001b[0m\n",
      "\u001b[33;1m====\u001b[0m\n",
      "\u001b[33;1mPrint outputs:\u001b[0m\n",
      "\u001b[32;20m\u001b[0m\n",
      "\u001b[33;1m>>> Final answer:\u001b[0m\n",
      "\u001b[32;20m武汉东湖比杭州西湖大，大 25.37 平方千米。\u001b[0m\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "'武汉东湖比杭州西湖大，大 25.37 平方千米。'"
      ]
     },
     "execution_count": 21,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "agent = ReactCodeAgent(tools=[TextRetrieval()], verbose=1, llm_engine=llm_engine)\n",
    "\n",
    "agent.run(\n",
    "    \"武汉东湖跟杭州西湖哪个大？，大多少呢？\"\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "5bce97f0-f60b-4fae-bde2-963aeff1dd72",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.11.0rc2"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
